/******************************************************************************
 *  _____     _____
 *  \  __\    \  __\
 *   \ \_\\    \ \_\\
 *    \  __\SS  \  __\roject
 *     \_\       \_\
 *
 * Mateusz Maciąg, Rafał Urbański
 * Komputerowe Systemy Sterowania
 *****************************************************************************/

#include "Utils.h"

#include <iterator>
#include <sstream>
#include <set>

namespace RafMat
{

using namespace std;

vector<double> Utils::convertStrToVector(const string& s, bool& succeed)
{
    // Usuwamy wiodące spacje
    string ts = trimWhiteSpaces(s);

    istringstream istr(ts);

    vector<double> v;
    char dummy;

    if(ts[0] == '[' && ts[ts.size()-1] == ']')
    {
        istr >> dummy;

        // Wczutaj strumień do wektora i zapisz jako nowy wielomian.
        typedef istream_iterator<double> iit;
        v = vector<double>(iit(istr), iit());
    }
    else
    {
        istr.setstate(ios::badbit);
    }

    succeed = !istr.bad();
    return v;
}

string Utils::trimWhiteSpaces(const string& str)
{
    /// \todo Wyszukiwanie wszystkich białych znaków, nie tylko spacji.

    int startpos = str.find_first_not_of(" ");
    int endpos = str.find_last_not_of(" ");

    if(startpos < 0) startpos = 0;

    return str.substr( startpos, endpos-startpos+1 );
}

bool Utils::matchesIdentifier(const std::string& str)
{
    if(str.empty())
        return false;

    char ch = str[0];

    if( (ch >= 'A' && ch <= 'Z') || (ch >= 'a' && ch <= 'z') || ch == '_' || ch == ':')
    {
        for(unsigned i = 1; i < str.size(); ++i)
        {
            ch = str[i];
            if( ch >= 'A' && ch <= 'Z') continue;
            if( ch >= 'a' && ch <= 'z') continue;
            if( ch >= '0' && ch <= '9') continue;
            if( ch == '_' || ch == '-' || ch == ':') continue;

            return false;
        }
        return true;
    }

    return false;
}

}
